package translinkApp.Adaptors.Sections;

import java.util.ArrayList;
import java.util.List;

import translinkApp.Adaptors.LocationsAdapter;

import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;

abstract public class SectionedAdapter extends BaseAdapter {
	abstract protected View getHeaderView(String caption, int index, View convertView,
			ViewGroup parent);

	private List<Section> sections = new ArrayList<Section>();
	private static int TYPE_SECTION_HEADER = 0;

	public void addSection(String caption, LocationsAdapter adapter) {
		sections.add(new Section(caption, adapter));
	}

	public Object getItem(int position) {
		for (Section section : this.sections) {
			if (position == 0) {
				return (section);
			}

			int size = section.adapter.getCount() + 1;

			if (position < size) {
				return (section.adapter.getItem(position - 1));
			}

			position -= size;
		}

		return (null);
	}

	public int getCount() {
		int total = 0;

		for (Section section : this.sections) {
			total += section.adapter.getCount() + 1; // add one for header
		}

		return (total);
	}

	public int getViewTypeCount() {
		int total = 1;

		for (Section section : this.sections) {
			total += section.adapter.getViewTypeCount();
		}

		return (total);
	}

	public int getItemViewType(int position) {
		int typeOffset = TYPE_SECTION_HEADER + 1;

		for (Section section : this.sections) {
			if (position == 0) {
				return (TYPE_SECTION_HEADER);
			}

			int size = section.adapter.getCount() + 1;

			if (position < size) {
				return (typeOffset + section.adapter.getItemViewType(position - 1));
			}

			position -= size;
			typeOffset += section.adapter.getViewTypeCount();
		}

		return (-1);
	}

	public boolean areAllItemsSelectable() {
		return (false);
	}

	public boolean isEnabled(int position) {
		return (getItemViewType(position) != TYPE_SECTION_HEADER);
	}

	public View getView(int position, View convertView, ViewGroup parent) {
		int sectionIndex = 0;

		for (Section section : this.sections) {
			if (position == 0) {
				return (getHeaderView(section.caption, sectionIndex, convertView, parent));
			}

			int size = section.adapter.getCount() + 1;

			if (position < size) {
				return (section.adapter.getView(position - 1, convertView, parent));
			}

			position -= size;
			sectionIndex++;
		}

		return (null);
	}

	public long getItemId(int position) {
		return (position);
	}

	public List<Section> getSections() {
		return sections;
	}

	class Section {
		String caption;
		LocationsAdapter adapter;

		Section(String caption, LocationsAdapter adapter) {
			this.caption = caption;
			this.adapter = adapter;
		}
	}
}